﻿using System.Diagnostics;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using RIABlog.LoginUI;
using RIABlog.Web;

namespace RIABlog
{
    /// <summary>
    /// <see cref="UserControl"/> class providing the main UI for the application.
    /// </summary>
    public partial class MainPage : UserControl
    {
        /// <summary>
        /// Ссылка на экземпляр приложения
        /// </summary>
        public App App
        {
            get { return (App)Application.Current; }
        }

        /// <summary>
        /// Ссылка на экземпляр контекста доступа к данным
        /// </summary>
        public RIABlogContext BlogContext
        {
            get { return this.App.BlogContext; }
        }

        /// <summary>
        /// Creates a new <see cref="MainPage"/> instance.
        /// </summary>
        public MainPage()
        {
            InitializeComponent();

            // Состояние меню зависит от того, аутентифицирован ли пользователь и есть ли у него уже блог или нет.
            // Подписываемся на соответствующие события.
            // Примечательно, что вызовы всех этих обработчиков автоматически маршализуются в UI-поток.

            WebContext.Current.Authentication.LoggedIn += (s, evt) => this.UpdateMenu();
            WebContext.Current.Authentication.LoggedOut += (s, evt) => this.UpdateMenu();

            this.BlogContext.Blogs.EntityAdded += (s, evt) => this.UpdateMenu();
            this.BlogContext.Blogs.EntityRemoved += (s, evt) => this.UpdateMenu();
        }

        /// <summary>
        /// After the Frame navigates, ensure the <see cref="HyperlinkButton"/> representing the current page is selected
        /// </summary>
        private void ContentFrame_Navigated(object sender, NavigationEventArgs e)
        {
            foreach (UIElement child in LinksStackPanel.Children)
            {
                HyperlinkButton hb = child as HyperlinkButton;
                if (hb != null && hb.NavigateUri != null)
                {
                    if (hb.NavigateUri.ToString().Equals(e.Uri.ToString()))
                    {
                        VisualStateManager.GoToState(hb, "ActiveLink", true);
                    }
                    else
                    {
                        VisualStateManager.GoToState(hb, "InactiveLink", true);
                    }
                }
            }
        }

        /// <summary>
        /// If an error occurs during navigation, show an error window
        /// </summary>
        private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            e.Handled = true;
            ErrorWindow.CreateNew(e.Exception);
        }

        /// <summary>
        /// Обновляет строку меню в зависимости от текущего залогиненного пользователя и наличия у него блога.
        /// </summary>
        private void UpdateMenu()
        {
            // получаем ссылку на текущего пользователя
            var user = WebContext.Current.User;

            if (user.IsAuthenticated)
            {
                this.tbEditMyBlog.Visibility = Visibility.Visible;

                // проверяем, есть ли уже блог у текущего пользователя
                bool blogAlreadyExists = this.BlogContext.Blogs.Any
                    (
                        blog => blog.Author == WebContext.Current.User.Name
                    );

                this.linkEditMyBlog.Content = blogAlreadyExists ?
                        ApplicationStrings.EditMyBlogPageTitle
                        :
                        ApplicationStrings.CreateMyBlogPageTitle;
            }
            else
            {
                this.tbEditMyBlog.Visibility = Visibility.Collapsed;
            }
        }
    }
}